package cn.fansunion.leecode.computer.plus;

import java.util.ArrayList;
import java.util.List;

import cn.fansunion.leecode.kit.Kit;

/**
 * 989. 数组形式的整数加法 对于非负整数 X 而言，X 的数组形式是每位数字按从左到右的顺序形成的数组。 例如，如果 X = 1231，那么其数组形式为 [1,2,3,1]。
 * 
 * 给定非负整数 X 的数组形式 A，返回整数 X+K 的数组形式。
 * 
 * 来源：力扣（LeetCode） 链接：https://leetcode-cn.com/problems/add-to-array-form-of-integer 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 * 
 * @author wen.lei@brgroup.com
 *
 *         2022-2-19
 */
public class AddToArrayFormOfInteger {

    /*示例 1：
    
    输入：A = [1,2,0,0], K = 34
    输出：[1,2,3,4]
    解释：1200 + 34 = 1234
    示例 2：
    
    输入：A = [2,7,4], K = 181
    输出：[4,5,5]
    解释：274 + 181 = 455
    示例 3：
    
    输入：A = [2,1,5], K = 806
    输出：[1,0,2,1]
    解释：215 + 806 = 1021
    示例 4：
    
    输入：A = [9,9,9,9,9,9,9,9,9,9], K = 1
    输出：[1,0,0,0,0,0,0,0,0,0,0]
    解释：9999999999 + 1 = 10000000000
     
    
    提示：
    
    1 <= A.length <= 10000
    0 <= A[i] <= 9
    0 <= K <= 10000
    如果 A.length > 1，那么 A[0] != 0*/
    /**
     * 把k转换成int[]数组形式，2个int[]相加。没有越界问题
     * 
     * @param num
     * @param k
     * @return
     */
    public List<Integer> addToArrayForm(int[] num, int k) {
        if (num == null || num.length == 0) {
            List<Integer> numList = new ArrayList<>();
            numList.add(k);
            return numList;
        }
        List<Integer> numList = new ArrayList<>();
        List<Integer> kNumList = Kit.intToDigitList(k);
        final int lengthA = kNumList.size();
        final int lengthB = num.length;
        int length = Math.max(lengthA, lengthB);
        int plus = 0;
        // 参考AddBinary的解题思路
        for (int index = 0; index < length; index++) {
            int a = 0;
            int b = 0;
            //从低位到高位
            if (index < lengthA) {
                a = kNumList.get(lengthA-index-1);
            }
            if (index < lengthB) {
                b = num[lengthB-index-1];
            }
            int sum = a + b + plus;
            //每次放在list的最前面，低位在后，高位在前（这种细节，写代码，确实容易忘额）
            numList.add(0,sum % 10);
            if (sum >= 10) {
                plus = 1;
            } else {
                plus = 0;
            }
        }
        // 新产生1个最高位
        if (plus == 1) {
            numList.add(0,plus);
        }
        return numList;
    }

    /**
     * 把数组转换成int整数，求和后，再转换成数组格式（代码麻烦，不推荐）
     * 
     * @param num
     * @param k
     * @return
     */
    public List<Integer> addToArrayFormNotGood(int[] num, int k) {
        if (num == null || num.length == 0) {
            List<Integer> numList = new ArrayList<>();
            numList.add(k);
            return numList;
        }
        int numInt = 0;
        numInt = numArrayToInt(num, numInt);
        // 可能越界了
        int totalSum = numInt + k;
        // 把数字totalSum再转换成list数组
        List<Integer> numList = Kit.intToDigitList(totalSum);
        return numList;

    }

    /**
     * 把1个十进制的数组，转换成1个十进制的整数
     * 
     * @param num
     * @param numInt
     * @return
     */
    private int numArrayToInt(int[] num, int numInt) {
        int numInt2 = Kit.digitArrayToInt(num);
        return numInt+numInt2;
    }
}
